package jus.poc.prodcons.v1;

import jus.poc.prodcons.*;

/**
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Producteur extends Acteur implements _Producteur {

    protected int nbMessages;
    protected int ecrits;
    protected ProdCons tampon;
    protected int id;

    /**
     * Constructeur d'un producteur
     *
     * @param type
     * @param observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @throws ControlException
     */
    protected Producteur(int type, Observateur observateur,
            int moyenneTempsDeTraitement, int deviationTempsDeTraitement)
            throws ControlException {
        super(type, observateur, moyenneTempsDeTraitement,
                deviationTempsDeTraitement);
    }

    /**
     * Constructeur d'un producteur avec identifiant
     *
     * @param observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @param tampon
     * @param moyex Le nombre moyen que le producteur va produire
     * @param derivex la derivation du nombre moyen
     * @param id Le numero du producteur
     * @throws ControlException
     */
    public Producteur(Observateur observateur, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement, ProdCons tampon, int moyex, int derivex, int id)
            throws ControlException {
        this(typeProducteur, observateur, moyenneTempsDeTraitement,
                deviationTempsDeTraitement);
        Aleatoire alea = new Aleatoire(moyex, derivex);
        this.tampon = tampon;
        nbMessages = alea.next();
        ecrits = 0;
        this.id = id;
    }

    @Override
    public int nombreDeMessages() {
        return nbMessages;
    }

    @Override
    public void run() {
        while (ecrits < nbMessages) {
            try {
                Aleatoire alea = new Aleatoire(this.moyenneTempsDeTraitement(),
                        this.deviationTempsDeTraitement());
                Thread.sleep(alea.next());
                tampon.put(this, new MessageX(this.toString()));
                ecrits++;
                //System.out.println("Producteur_"+id+", encore "+(nbMessages-ecrits)+" messages !");
            } catch (InterruptedException e) {
            } catch (Exception e) {
            }
        }
    }

    @Override
    public String toString() {
        return "Prod" + id;
    }
}
